package com.ztools.common.util.common;

import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.ztools.common.model.pc.login.LoginToken;
import com.ztools.common.model.pc.sys.User;
import com.ztools.common.util.pc.RedisUtil;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * @Author: 一口香菜
 * @Date: 2023/3/3  19:00
 * @Version 1.0
 * token工具类
 */
@Component
public class TokenUtil {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 添加token
     *
     * @return
     */
    public LoginToken add(User user) {
        String uuid = IdUtil.simpleUUID();
        LoginToken loginToken = LoginToken.builder()
                .userId(user.getId())
                .password(user.getPassword())
                .token(uuid)
                .build();
        stringRedisTemplate.opsForValue().set(RedisUtil.LOGIN_TOKEN + uuid, JSONUtil.toJsonStr(loginToken), 1, TimeUnit.HOURS);
        return loginToken;
    }

    /**
     * 查询token
     *
     * @param token token
     * @return
     */
    public LoginToken get(String token) {
        if (StrUtil.isNotEmpty(token)) {
            String tokenStr = stringRedisTemplate.opsForValue().get(RedisUtil.LOGIN_TOKEN + token);
            if (StrUtil.isNotEmpty(tokenStr)) {
                LoginToken loginToken = JSONUtil.toBean(tokenStr, LoginToken.class);
                // 刷新token
                refresh(token);
                return loginToken;
            }

        }
        return null;
    }

    /**
     * 刷新token
     *
     * @param token
     */
    public void refresh(String token) {
        stringRedisTemplate.boundValueOps(RedisUtil.LOGIN_TOKEN + token).expire(1L, TimeUnit.HOURS);
    }

    /**
     * 删除token
     *
     * @param token token
     */
    public void delete(String token) {
        stringRedisTemplate.delete(RedisUtil.LOGIN_TOKEN + token);
        stringRedisTemplate.delete(RedisUtil.CURRUSER);
    }

}
